<?php
/**
 * @date        <!-- phpDesigner :: Timestamp [08-07-2010 01:23:13] -->
 * @filesource  class.user.php
 * @package     WebCms
 * @copyright	Copyright (C) 2010
 * @author      Sérgio 'Horizak' Alves
 */

// Sem acesso directo
defined('_WEXEC') or die('Restricted access');

/**
 * Class de utilizador
 *
 * @var         private boolean $logged - user logado ou não
 * @var         private array $data - contém dados do utilizador
 * @var         string $error - contém o erro ocorrido
 */
class User {
  private $logged;
  private $data;
  var $error;

  /**
   * Função construtora
   * 
   */
  function __construct() {
    $this->logged = false;
    $this->data['id'] = 0;
    $this->data['luser'] = 'Guest';
    $this->data['browser'] = $_SERVER['HTTP_USER_AGENT'];

    $this->data['checkIP'] = $_SERVER['REMOTE_ADDR'];
    $this->checkSession = isset($_COOKIE['checkSession'])?cms_escapeSql($_COOKIE['checkSession']):(isset($_SESSION['checkSession'])?
      cms_escapeSql($_SESSION['checkSession']):null);
    $this->authExpire = isset($_COOKIE['authExpire'])?$_COOKIE['authExpire']:null;

    if($this->getUser()) $this->login();
    else  $this->logout();
  }

  /**
   * Verifica o utilizador na base dados
   * 
   * @var           string $user
   * @var           array $params - parâmetros opcionais
   */
  function getUser($user = null,$params = array()) {
    global $cms;
    $user = !is_null($user)?cms_escapeSql($user):null;

    if(is_null($user) and !$this->checkSession) return false;

    $and = isset($user)?"luser = '{$user}'":"session = '{$this->checkSession}' AND ip = '{$this->data['checkIP']}'";

    $sql = "SELECT * FROM ".DBUSER;
    $sql .= " WHERE {$and}";
    $sql .= " AND enabled = '1'";

    if($cms->obj['mysql']->getTotal($sql)) {
      $array = mysql_fetch_array($cms->obj['mysql']->result);
      foreach($array as $key => $value)
        if(!is_numeric($key)) $this->data[$key] = $value;
      return true;
    } else  return false;
  }

  /**
   * Verifica o utilizador na base dados para fazer login
   * 
   * @var           string $user
   * @var           string $pw
   * @var           string $expire - duração do login | definido = next year
   * @var           array $params - parâmetros opcionais
   */
  function verify($user,$pw,$expire = 'next year',$params = array()) {
    $this->authExpire = $expire;
    $pwEncrypt = $this->pwEncrypt($pw);

    if(!$user) {
      $this->error = L_NOUSER;
      return false;
    } elseif(!$pw) {
      $this->error = L_NOPASS;
      return false;
    } else {
      if($this->getUser($user) and $pwEncrypt == $this->data['upw']) {
        $this->login(true);
        return true;
      } else {
        $this->error = L_WRONGDATA;
        return false;
      }
    }
  }

  /**
   * Login user
   * 
   * @var           boolean $firstLogin | definido = false
   * @var           array $params - parâmetros opcionais
   */
  function login($firstLogin = false,$params = array()) {
    global $cms;

    $this->checkSession = $this->sessionEncrypt($this->data['luser']);

    if($firstLogin == true) {
      $lastLogin = cms_date('mysql');
      $sql = "UPDATE ".DBUSER." SET";
      $sql .= " lastlogin = '{$lastLogin}',";
      $sql .= " session = '{$this->checkSession}',";
      $sql .= " ip = '{$this->data['checkIP']}'";
      $sql .= " WHERE luser = '{$this->data['luser']}'";
      $sql .= " LIMIT 1";
      $cms->obj['mysql']->sql($sql);
      cms_cookie('checkSession',$this->checkSession,$this->authExpire);
      $_SESSION['checkSession'] = $this->checkSession;
    }
    cms_cookie('authExpire',$this->authExpire,$this->authExpire);

    $this->logged = true;
  }

  /**
   * Logout user
   * 
   */
  function logout() {
    $this->logged = false;
    cms_cookie('checkSession');
    cms_cookie('authExpire');
    unset($_SESSION['checkSession']);
  }

  /**
   * Encrypt password
   * 
   * @var           string $pw - password para encriptar
   * @var           array $params - parâmetros opcionais
   * @return        string - password encriptada
   * 
   * @todo          melhorar a encriptação
   */
  function pwEncrypt($pw,$params = array()) {
    $encrypt = md5($pw);
    $salt = md5("$webCms!");

    return md5(crc32(sha1($encrypt).$salt));
  }

  /**
   * Geta data user
   * 
   * @var           array/string $data - retorna um ou varios dados do utilizador | definido = null
   * @var           array $params - parâmetros opcionais
   * @return        array/string
   */
  function getData($data = null,$params = array()) {
    if(is_null($data)) return $this->data;
    elseif(is_string($data)) $return = isset($this->data[$data])?$this->data[$data]:null;
    elseif(is_array($data))
      foreach($data as $value) $return[$value] = $this->data[$value];

    return $return;
  }

  /**
   * Encripta a sessao do login do utilizador
   * 
   * @var           string $user - nome do utilizador
   * @var           array $params - parâmetros opcionais
   * @return        string
   */
  function sessionEncrypt($user,$params = array()) {
    return md5(time().$user.microtime());
  }

  /**
   * Retorna se o utilizador esta logado ou não
   * 
   */
  function logged() {
    if($this->logged) return true;
    else  return false;
  }
}
?>